home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
041-050
/
amok46
/
programme
/
d2.mod
< prev
next >
Wrap
Text File
|
1993-11-04
|
40KB
|
1,491 lines
(*
* -------------------------------------------------------------------------
*
* :Program. d2
* :Contents. Ein Druckprogramm.
* :Author. Reiner Nix
* :Address. Geranienhof 2, 5000 Köln 71 Seeberg
* :Copyright. Public Domain
* :Language. Modula-2
* :Translator. M2Amiga A-L V3.3d
* :History. V1.0 1.11.90
* :History. V1.1 21.11.90 (File-Requester dazu)
* :Imports. ARPFileReq, AMOK #31 neu übersetzt
* :Imports. IntuitionTools, siehe diese Diskette
* :Imports. AmigaGraphik, siehe diese Diskette
* :Imports. IntuitionTools, siehe diese Diskette
* :Imports. FileOut, siehe diese Diskette
* :Bugs. Die Procedure DateToStr arbeitet anscheinend je nach
* :Bugs. Seitenwind, Glatteis und Laune. Dadurch ist das
* :Bugs. Ergebnis recht willkürlich.
*
* -------------------------------------------------------------------------
*)
MODULE d2;
FROM SYSTEM IMPORT ADR, LONGSET;
FROM Arts IMPORT Assert, TermProcedure;
FROM Exec IMPORT Wait, WaitPort, GetMsg, ReplyMsg;
FROM Graphics IMPORT FontStyleSet, FontFlagSet,
TextAttr,
TextFontPtr;
FROM Intuition IMPORT pica, elite, fine, draft, letter, single,
IDCMPFlags, IDCMPFlagSet,
WindowFlags, WindowFlagSet,
ScreenFlags, ScreenFlagSet,
NewWindow, IntuiMessage, Preferences,
WindowPtr, IntuiMessagePtr, GadgetPtr,
RemoveGadget, AddGadget, GetPrefs;
FROM Dos IMPORT Date, DateStamp;
FROM Workbench IMPORT WBObjectType,
DiskObjectPtr;
FROM Icon IMPORT GetDiskObject, FreeDiskObject,
FindToolType, MatchToolValue;
FROM Arguments IMPORT NumArgs, GetArg;
FROM ASCII IMPORT sp, cr, eol, lf, ff, ht, csi, esc;
FROM DateConversions IMPORT DateInfo, FromDos, DateToStr;
FROM Heap IMPORT Allocate, Deallocate;
FROM Conversions IMPORT StrToVal;
FROM Str IMPORT Copy, Concat, FirstPos, Compare, Length;
FROM Strings IMPORT Delete, Occurs;
FROM FileSystem IMPORT File, Response,
Lookup, Close, ReadChar;
FROM FileMessage IMPORT StrPtr,
ResponseText;
FROM IntuitionTools IMPORT initNewWindow, initTextAttr,
enableGadgets, disableGadgets;
FROM AmigaGraphik IMPORT OpenWindow, CloseWindow, UseWindow,
NewWindowSize, SetAPen,
OpenFont, CloseFont, UseFont,
Move, DrawBox, DrawLine, FillRectangle,
WriteString, Write, WriteCard;
FROM IntuitionObjekte IMPORT ObjektEreignis, ObjektTyp, ObjektEnde,
ObjektPtr,
EingabeOk,
setzeTextZeichensatz, setzeEingabeZeichensatz,
loescheObjekt, loescheAlleObjekte,
aenderInfoSatz,
erzeugeBooleanObjekt,
erzeugeTextObjekt, erzeugeCardObjekt,
frageObjektNr, findeObjekt, frageGadget,
erneuerObjekt, verbindeObjekte,
verarbeiteNachricht, frageEnde;
IMPORT FileOut;
FROM ARPFileReq IMPORT FileReq;
CONST keinFenster ="Ausgabefenster ist nicht zu öffnen";
keinZeichensatz ="Zeichensatz Topaz8 nicht zu öffnen";
ja =" Ja ";
nein =" Nein ";
minus =" < ";
plus =" > ";
entwurf =" Entwurf ";
brief =" Brief ";
Tpica =" Pica ";
Telite =" Elite ";
Tfine =" Fine ";
frei =" Frei ";
modula =" Modula ";
KopfID = 1;
EinzelblattID = 2;
VorschubID = 3;
NummerierungID = 4;
ZielID = 5;
TabulatorID = 6; minusID =1; plusID =2;
RandObenID = 9;
RandUntenID =12;
RandLinksID =15;
RandRechtsID =18;
BlattLaengeID =21;
QualitaetID =24;
BreiteID =25;
FormatID =26;
EingabeID =27;
OeffnenID =28;
MeldenID =30;
WeiterID =31;
maxDateiname =45;
TYPE TZustand =(Text, Satz1, Satz2, Bemerkung);
TDateiname =ARRAY[0..maxDateiname+1] OF CHAR;
TQualitaet =(Entwurf, Brief);
TBreite =(Pica, Elite, Fine);
TFormat =(Frei, Modula);
TEinstellung =RECORD Kopf, Einzelblatt,
Vorschub, Nummerierung :BOOLEAN;
Ziel :TDateiname;
Tabulator,
RandOben, RandUnten,
RandLinks, RandRechts,
BlattLaenge :CARDINAL;
Qualitaet :TQualitaet;
Breite :TBreite;
Format :TFormat
END;
VAR Fenster, MFenster :WindowPtr;
NachrichtPtr :IntuiMessagePtr;
Nachricht :IntuiMessage;
Programmende,
DruckMeldung, DruckWeiter :BOOLEAN;
Topaz8, Pearl8 :TextFontPtr;
Einstellung :TEinstellung;
EingabeText, Programmname :TDateiname;
ErstesArgument :INTEGER;
PROCEDURE UpString (VAR Satz :ARRAY OF CHAR);
VAR i :CARDINAL;
BEGIN
i := 0;
WHILE (i < CARDINAL (HIGH (Satz))) AND (Satz[i] # 0C) DO
CASE Satz[i] OF
| 'a'..'z': Satz[i] := CAP (Satz[i]);
| 'ä' : Satz[i] := "Ä"
ELSE
END;
INC (i)
END
END UpString;
PROCEDURE BenutzeStandard (VAR Einstellung :TEinstellung);
BEGIN
WITH Einstellung DO
Kopf := TRUE;
Einzelblatt := FALSE;
Vorschub := TRUE;
Nummerierung := TRUE;
Ziel := "Prt:";
Tabulator := 8;
RandOben := 0; RandUnten := 0;
RandLinks := 1; RandRechts := 92;
BlattLaenge := 72;
Qualitaet := Entwurf;
Breite := Elite;
Format := Modula
END
END BenutzeStandard;
PROCEDURE BenutzePreferences (VAR Einstellung :TEinstellung);
VAR Prefs :Preferences;
BEGIN
GetPrefs (ADR (Prefs), SIZE (Preferences));
WITH Einstellung DO
WITH Prefs DO
IF paperType = single THEN
Einzelblatt := TRUE END;
RandLinks := printLeftMargin;
RandRechts := printRightMargin;
BlattLaenge := paperLength;
IF printQuality = draft THEN
Qualitaet := Entwurf
ELSIF printQuality = letter THEN
Qualitaet := Brief
END;
IF printPitch = pica THEN
Breite := Pica
ELSIF printPitch = elite THEN
Breite := Elite
ELSIF printPitch = fine THEN
Breite := Fine
END
END
END
END BenutzePreferences;
PROCEDURE BenutzeIcon (VAR Einstellung :TEinstellung;
VAR ErstesArgument :INTEGER);
VAR Programmicon :DiskObjectPtr;
Laenge :INTEGER;
ToolType :POINTER TO ARRAY [0..128] OF CHAR;
PROCEDURE CheckBooleanTool (VAR Tool :BOOLEAN;
Toolname :ARRAY OF CHAR);
BEGIN
ToolType := FindToolType (Programmicon^.toolTypes, ADR (Toolname));
IF ToolType # NIL THEN
IF MatchToolValue (ToolType, ADR ("Ja")) OR
MatchToolValue (ToolType, ADR ("ja")) OR
MatchToolValue (ToolType, ADR ("JA")) THEN
Tool := TRUE
ELSIF MatchToolValue (ToolType, ADR ("Nein")) OR
MatchToolValue (ToolType, ADR ("nein")) OR
MatchToolValue (ToolType, ADR ("NEIN")) THEN
Tool := FALSE
END
END
END CheckBooleanTool;
PROCEDURE CheckCardinalTool (VAR Tool :CARDINAL;
Toolname :ARRAY OF CHAR);
VAR Negativ, Fehler :BOOLEAN;
Zahl :LONGINT;
BEGIN
ToolType := FindToolType (Programmicon^.toolTypes, ADR (Toolname));
IF ToolType # NIL THEN
StrToVal (ToolType^, Zahl, Negativ, 10, Fehler);
IF NOT (Fehler) AND (0 <= Zahl) AND (Zahl <= 1000) THEN
Tool := CARDINAL (Zahl)
END
END
END CheckCardinalTool;
(* BenutzeIcon *)
BEGIN
WITH Einstellung DO
GetArg (0, Programmname, Laenge);
Programmicon := GetDiskObject (ADR (Programmname));
IF (Programmicon # NIL) AND (Programmicon^.type = project) THEN
ToolType := Programmicon^.defaultTool;
Copy (Programmname, ToolType^);
FreeDiskObject (Programmicon);
Programmicon := GetDiskObject (ADR (Programmname));
ErstesArgument := 0
ELSE
ErstesArgument := 1
END;
IF Programmicon # NIL THEN
CheckBooleanTool (Kopf, "KOPF");
CheckBooleanTool (Einzelblatt, "EINZELBLATT");
CheckBooleanTool (Vorschub, "VORSCHUB");
CheckBooleanTool (Nummerierung, "NUMMERIERUNG");
ToolType := FindToolType (Programmicon^.toolTypes, ADR ("ZIEL"));
IF ToolType # NIL THEN
Copy (Ziel, ToolType^)
END;
CheckCardinalTool (Tabulator, "TABULATOR");
CheckCardinalTool (RandOben, "RANDOBEN");
CheckCardinalTool (RandUnten, "RANDUNTEN");
CheckCardinalTool (RandLinks, "RANDLINKS");
CheckCardinalTool (RandRechts, "RANDRECHTS");
CheckCardinalTool (BlattLaenge, "BLATTLÄNGE");
ToolType := FindToolType (Programmicon^.toolTypes, ADR ("QUALITÄT"));
IF ToolType # NIL THEN
IF MatchToolValue (ToolType, ADR ("Entwurf")) OR
MatchToolValue (ToolType, ADR ("ENTWURF")) THEN
Qualitaet := Entwurf
ELSIF MatchToolValue (ToolType, ADR ("Brief")) OR
MatchToolValue (ToolType, ADR ("BRIEF")) THEN
Qualitaet := Brief
END
END;
ToolType := FindToolType (Programmicon^.toolTypes, ADR ("BREITE"));
IF ToolType # NIL THEN
IF MatchToolValue (ToolType, ADR ("Pica")) OR
MatchToolValue (ToolType, ADR ("PICA")) THEN
Breite := Pica
ELSIF MatchToolValue (ToolType, ADR ("Elite")) OR
MatchToolValue (ToolType, ADR ("ELITE")) THEN
Breite := Elite
ELSIF MatchToolValue (ToolType, ADR ("Fine")) OR
MatchToolValue (ToolType, ADR ("FINE")) THEN
Breite := Fine
END
END;
ToolType := FindToolType (Programmicon^.toolTypes, ADR ("FORMAT"));
IF ToolType # NIL THEN
IF MatchToolValue (ToolType, ADR ("Frei")) OR
MatchToolValue (ToolType, ADR ("FREI")) THEN
Format := Frei
ELSIF MatchToolValue (ToolType, ADR ("Modula")) OR
MatchToolValue (ToolType, ADR ("MODULA")) THEN
Format := Modula
END
END;
FreeDiskObject (Programmicon)
END
END
END BenutzeIcon;
PROCEDURE schreibeInfo;
VAR i :CARDINAL;
BEGIN
SetAPen (1);
Move ( 40, 31); WriteString ("Kopfzeile drucken");
Move ( 40, 40); WriteString ("Einzelblätter bedrucken");
Move ( 40, 49); WriteString ("Blattvorschub am Dateiende");
Move ( 40, 58); WriteString ("Zeilen nummerieren");
Move ( 40, 67); WriteString ("Ausgabequalität");
Move ( 40, 76); WriteString ("Zeichenbreite");
Move ( 40, 85); WriteString ("Formatierung");
SetAPen (2);
DrawBox (20, 14, 620,156);
SetAPen (1);
DrawBox (21, 15, 619,155); DrawBox ( 22, 16, 618,154);
DrawLine (23, 16, 23,154); DrawLine (617, 16, 617,154);
SetAPen (2);
DrawBox (20,214, 620,239);
SetAPen (1);
DrawBox (21,215, 619,238); DrawBox ( 22,216, 618,237);
DrawLine (23,216, 23,237); DrawLine (617,215, 617,237)
END schreibeInfo;
PROCEDURE MeldenAktion ( Ereignis :ObjektEreignis;
objekt :ObjektPtr);
BEGIN
CASE frageObjektNr (objekt) OF
| MeldenID: DruckMeldung := TRUE
| WeiterID: DruckWeiter := TRUE
ELSE
END
END MeldenAktion;
PROCEDURE Meldung ( Text :ARRAY OF CHAR;
WeiterMoeglich :BOOLEAN);
VAR neuFenster :NewWindow;
Signal :LONGSET;
NachrichtPtr :IntuiMessagePtr;
BEGIN
initNewWindow (neuFenster,
20,194, 600,26, 1,2,
IDCMPFlagSet {},
WindowFlagSet {(*windowDrag, windowDepth,*)noCareRefresh},
NIL, NIL,
ADR (" Meldung "),
NIL, NIL,
50,25, -1,-1,
ScreenFlagSet {wbenchScreen});
MFenster := OpenWindow (neuFenster);
Assert (MFenster # NIL, ADR (keinFenster));
UseWindow (MFenster); SetAPen (1);
Move (20,20); WriteString (Text);
IF WeiterMoeglich THEN
erzeugeBooleanObjekt (MFenster, 450,13, " Weiter ", WeiterID, melden,
MeldenAktion)
END;
erzeugeBooleanObjekt (MFenster, 520,13, " O.K. ", MeldenID, melden,
MeldenAktion);
DruckMeldung := FALSE; DruckWeiter := FALSE;
WHILE NOT (DruckMeldung OR DruckWeiter) DO
Signal := Wait (LONGSET {Fenster^.userPort^.sigBit,
MFenster^.userPort^.sigBit});
REPEAT
NachrichtPtr := GetMsg (Fenster^.userPort);
IF NachrichtPtr # NIL THEN
IF newSize IN NachrichtPtr^.class THEN
UseWindow (Fenster); NewWindowSize
END;
ReplyMsg (NachrichtPtr)
END
UNTIL NachrichtPtr = NIL;
REPEAT
NachrichtPtr := GetMsg (MFenster^.userPort);
IF NachrichtPtr # NIL THEN
verarbeiteNachricht (MFenster, NachrichtPtr^);
ReplyMsg (NachrichtPtr)
END
UNTIL NachrichtPtr = NIL
END;
loescheAlleObjekte (MFenster);
CloseWindow (MFenster);
UseWindow (Fenster)
END Meldung;
PROCEDURE DruckeDatei ( Quelle :ARRAY OF CHAR;
VAR Fehler :BOOLEAN);
CONST maxWort =15;
R1 ="AND ARRAY BEGIN BY CASE CONST DEFINITION DIV DO ELSE ";
R2 ="ELSIF END EXIT EXPORT FOR FROM IF IMPLEMENTATION IMPORT ";
R3 ="IN LOOP MOD MODULE NOT OF OR POINTER PROCEDURE QUALIFIED ";
R4 ="RECORD REPEAT RETURN SET THEN TO TYPE UNTIL VAR WHILE WITH ";
VAR QuellDatei, ZielDatei :File;
Fehlermeldung :ARRAY [0..80] OF CHAR;
FehlerText :StrPtr;
Zustand :TZustand;
BemerkungsTiefe,
SeitenNr, ZeilenNr,
ZeilenPos, SpaltenPos :LONGCARD;
i :CARDINAL;
Zeichen, AltesZeichen :CHAR;
Wiederholen,
DruckAbbruch :BOOLEAN;
Reserviert :ARRAY [0..300] OF CHAR;
PROCEDURE KursivAn;
BEGIN
FileOut.Write (ZielDatei, csi);
FileOut.WriteString (ZielDatei, "3m")
END KursivAn;
PROCEDURE KursivAus;
BEGIN
FileOut.Write (ZielDatei, csi);
FileOut.WriteString (ZielDatei, "0m")
END KursivAus;
PROCEDURE KleinschriftAn;
BEGIN
FileOut.Write (ZielDatei, csi);
FileOut.WriteString (ZielDatei, "4v")
END KleinschriftAn;
PROCEDURE KleinschriftAus;
BEGIN
FileOut.Write (ZielDatei, csi);
FileOut.WriteString (ZielDatei, "3v")
END KleinschriftAus;
PROCEDURE FettAn;
BEGIN
FileOut.Write (ZielDatei, csi);
FileOut.WriteString (ZielDatei, "1m")
END FettAn;
PROCEDURE FettAus;
BEGIN
FileOut.Write (ZielDatei, csi);
FileOut.WriteString (ZielDatei, "0m")
END FettAus;
PROCEDURE UnterstreichenAn;
BEGIN
FileOut.Write (ZielDatei, csi);
FileOut.WriteString (ZielDatei, "4m")
END UnterstreichenAn;
PROCEDURE UnterstreichenAus;
BEGIN
FileOut.Write (ZielDatei, csi);
FileOut.WriteString (ZielDatei, "0m")
END UnterstreichenAus;
PROCEDURE frageDatum (VAR DatumsText :ARRAY OF CHAR);
CONST DatumsFormat ="%d.%t %Y %H:%M";
Monate ="Januar|Februar|März|April|Mai|Juni|Juli|August|September|Oktober|November|Dezember|";
VAR Datum :Date;
DatumsInfo :DateInfo;
BEGIN
DateStamp (ADR (Datum));
FromDos (Datum, DatumsInfo);
DateToStr (DatumsInfo, DatumsFormat, Monate, DatumsText)
END frageDatum;
PROCEDURE druckeKopf;
VAR i :CARDINAL;
l :INTEGER;
DatumsText :ARRAY [0..30] OF CHAR;
BEGIN
WITH Einstellung DO
IF Kopf THEN
IF Zustand = Bemerkung THEN
KursivAus END;
FOR i := 1 TO RandOben DO
FileOut.WriteLn (ZielDatei);
INC (ZeilenPos)
END;
UnterstreichenAn;
l := RandRechts - RandLinks;
frageDatum (DatumsText);
DEC (l, 12 + Length (Quelle) + Length (DatumsText));
FileOut.WriteString (ZielDatei, "Seite: ");
FileOut.WriteCard (ZielDatei, SeitenNr,3);
FileOut.WriteString (ZielDatei, " '");
FileOut.WriteString (ZielDatei, Quelle);
FileOut.Write (ZielDatei, "'");
FOR i := 1 TO l DO
FileOut.Write (ZielDatei, sp)
END;
FileOut.WriteString (ZielDatei, DatumsText);
FileOut.WriteLn (ZielDatei);
UnterstreichenAus;
FileOut.WriteLn (ZielDatei);
INC (ZeilenPos, 2);
SpaltenPos := RandLinks;
INC (SeitenNr);
IF Zustand = Bemerkung THEN
KursivAn
END
END
END
END druckeKopf;
PROCEDURE initDrucken;
BEGIN
disableGadgets (Fenster, LONGSET {KopfID..OeffnenID});
DruckAbbruch := FALSE
END initDrucken;
PROCEDURE resetDrucken;
BEGIN
Move (500,231); WriteString (" ");
enableGadgets (Fenster, LONGSET {KopfID..OeffnenID})
END resetDrucken;
PROCEDURE startDrucken;
BEGIN
WITH Einstellung DO
FileOut.Write (ZielDatei, esc); (* initPrinter *)
FileOut.WriteString (ZielDatei, "#1");
FileOut.Write (ZielDatei, csi); (* Left & Right *)
FileOut.WriteCard (ZielDatei, RandLinks, 1);
FileOut.Write (ZielDatei, ";");
FileOut.WriteCard (ZielDatei, RandRechts, 1);
FileOut.Write (ZielDatei, "s");
FileOut.Write (ZielDatei, csi); (* NLQ *)
CASE Qualitaet OF
| Entwurf :FileOut.WriteString (ZielDatei, '1"z')
| Brief :FileOut.WriteString (ZielDatei, '2"z')
ELSE
END;
FileOut.Write (ZielDatei, csi); (* Pitch *)
CASE Breite OF
| Pica :FileOut.WriteString (ZielDatei, '0w')
| Elite :FileOut.WriteString (ZielDatei, '2w')
| Fine :FileOut.WriteString (ZielDatei, '4w')
ELSE
END;
SeitenNr := 1;
ZeilenNr := 1;
ZeilenPos := 1;
SpaltenPos := RandLinks;
druckeKopf;
IF Nummerierung THEN
KleinschriftAn;
FileOut.WriteCard (ZielDatei, ZeilenNr, 5);
FileOut.Write (ZielDatei, ":");
KleinschriftAus;
INC (ZeilenNr)
END
END
END startDrucken;
PROCEDURE stopDrucken;
BEGIN
WITH Einstellung DO
IF Vorschub THEN
FileOut.Write (ZielDatei, ff)
END;
FileOut.Write (ZielDatei, esc); (* initPrinter *)
FileOut.WriteString (ZielDatei, "#1")
END
END stopDrucken;
PROCEDURE neueSeite;
BEGIN
WITH Einstellung DO
FileOut.Write (ZielDatei, ff);
ZeilenPos := 1;
IF Einzelblatt THEN
Meldung ("Seitenende erreicht.", FALSE)
END;
druckeKopf
END
END neueSeite;
PROCEDURE bearbeiteDruckNachricht;
VAR NachrichtPtr :IntuiMessagePtr;
Nachricht :IntuiMessage;
BEGIN
REPEAT
NachrichtPtr := GetMsg (Fenster^.userPort);
IF NachrichtPtr # NIL THEN
Nachricht := NachrichtPtr^;
ReplyMsg (NachrichtPtr);
verarbeiteNachricht (Fenster, Nachricht);
IF newSize IN Nachricht.class THEN
NewWindowSize;
schreibeInfo
ELSIF closeWindow IN Nachricht.class THEN
DruckAbbruch := TRUE
END
END
UNTIL (NachrichtPtr = NIL)
END bearbeiteDruckNachricht;
PROCEDURE neueZeile;
BEGIN
WITH Einstellung DO
IF ZeilenPos < BlattLaenge-RandUnten THEN
FileOut.WriteLn (ZielDatei);
INC (ZeilenPos)
ELSE
neueSeite
END;
SpaltenPos := RandLinks;
END;
SetAPen (1);
Move (500,231); WriteString ("Zeile:");
Move (548,231); WriteCard (ZeilenNr,5)
END neueZeile;
PROCEDURE schreibeZeichen ( Zeichen :CHAR);
BEGIN
bearbeiteDruckNachricht;
WITH Einstellung DO
IF SpaltenPos >= RandRechts THEN
neueZeile
ELSE
INC (SpaltenPos)
END;
FileOut.Write (ZielDatei, Zeichen)
END
END schreibeZeichen;
PROCEDURE TesteModulaWort;
VAR i,j :CARDINAL;
Puffer :ARRAY [0..maxWort+2] OF CHAR;
BEGIN
IF (Zustand # Text) OR (Zeichen < "A") OR ("Z" < Zeichen) THEN
schreibeZeichen (Zeichen);
RETURN
END;
i := 0;
WHILE (i < maxWort) AND ("A" <= Zeichen) AND (Zeichen <= "Z") DO
Puffer[i] := Zeichen; INC (i);
ReadChar (QuellDatei, Zeichen)
END;
AltesZeichen := Zeichen; Wiederholen := TRUE;
IF i < maxWort THEN
Puffer[i] := sp;
Puffer[i+1] := 0C;
IF (i > 1) AND (Occurs (Reserviert, 0, Puffer, FALSE) # -1) THEN
FettAn;
j := 0;
WHILE j < i DO
schreibeZeichen (Puffer[j]); INC (j)
END;
FettAus
ELSE
j := 0;
WHILE j < i DO
schreibeZeichen (Puffer[j]); INC (j)
END
END
ELSE
j := 0;
WHILE j < i DO
schreibeZeichen (Puffer[j]); INC (j)
END;
WHILE ("A" <= Zeichen) AND (Zeichen <= "Z") DO
schreibeZeichen (Zeichen);
ReadChar (QuellDatei, Zeichen)
END
END
END TesteModulaWort;
(* DruckeDatei *)
BEGIN
Fehler := FALSE;
WITH Einstellung DO
IF RandLinks + 5 > RandRechts THEN
Meldung ("Linker und rechter Rand sind unpassend. Abbrechen ?", TRUE);
IF DruckMeldung THEN
Fehler := TRUE;
RETURN
END
END;
IF Tabulator >= RandRechts THEN
Meldung ("Der Tabulatorwert ist seltsam. Abbrechen ?", TRUE);
IF DruckMeldung THEN
Fehler := TRUE;
RETURN
END
END;
IF RandOben + 5 + RandUnten >= BlattLaenge THEN
Meldung ("Blattlänge, oberer und unterer Rand sind seltsam. Abbrechen ?",
TRUE);
IF DruckMeldung THEN
Fehler := TRUE;
RETURN
END
END
END;
initDrucken;
Copy (Reserviert, R1); Concat (Reserviert, R2);
Concat (Reserviert, R3); Concat (Reserviert, R4);
REPEAT
Lookup (QuellDatei, Quelle, 512, FALSE);
IF QuellDatei.res # done THEN
ResponseText (QuellDatei.res, FehlerText);
Close (QuellDatei);
Copy (Fehlermeldung, "Fehler beim Öffnen der Quelldatei: ");
Concat (Fehlermeldung, FehlerText^);
Meldung (Fehlermeldung, TRUE);
IF DruckMeldung THEN
Fehler := TRUE
ELSE
Fehler := NOT (FileReq (Quelle, Fenster, "D2: Quelldatei ?", FALSE))
END;
IF Fehler THEN
resetDrucken;
RETURN
END
END
UNTIL QuellDatei.res = done;
Lookup (ZielDatei, Einstellung.Ziel, 0, TRUE);
IF ZielDatei.res # done THEN
ResponseText (ZielDatei.res, FehlerText);
Close (ZielDatei);
Copy (Fehlermeldung, "Fehler beim Öffnen der Zieldatei: ");
Concat (Fehlermeldung, FehlerText^);
Meldung (Fehlermeldung, FALSE);
Fehler := TRUE;
resetDrucken;
RETURN
END;
Zustand := Text;
Wiederholen := FALSE;
BemerkungsTiefe:= 0;
WITH Einstellung DO
startDrucken;
REPEAT
IF Wiederholen THEN
Zeichen := AltesZeichen;
Wiederholen := FALSE
ELSE
ReadChar (QuellDatei, Zeichen)
END;
IF Zeichen = ff THEN
neueSeite
ELSIF Zeichen = lf THEN
IF (Zustand = Satz1) OR (Zustand = Satz2) THEN
Zustand := Text
END;
neueZeile;
IF Nummerierung THEN
KleinschriftAn;
IF Zustand = Bemerkung THEN
KursivAus
END;
FileOut.WriteCard (ZielDatei, ZeilenNr, 5);
FileOut.Write (ZielDatei, ":");
KleinschriftAus;
INC (SpaltenPos, 6);
IF Zustand = Bemerkung THEN
KursivAn
END
END;
INC (ZeilenNr)
ELSIF (Zeichen = csi) OR (Zeichen = esc) THEN
REPEAT
FileOut.Write (ZielDatei, Zeichen);
ReadChar (QuellDatei, Zeichen)
UNTIL (("A" <= CAP (Zeichen)) AND (CAP (Zeichen) <= "Z"))
ELSIF Zeichen = "'" THEN
IF Format = Modula THEN
CASE Zustand OF
| Text :Zustand := Satz1
| Satz1 :Zustand := Text
ELSE
END
END;
schreibeZeichen (Zeichen)
ELSIF Zeichen = '"' THEN
IF Format = Modula THEN
CASE Zustand OF
| Text :Zustand := Satz2
| Satz2 :Zustand := Text
ELSE
END
END;
schreibeZeichen (Zeichen)
ELSIF Zeichen = "(" THEN
IF (Format = Modula) AND ((Zustand = Text) OR (Zustand = Bemerkung)) THEN
ReadChar (QuellDatei, Zeichen);
IF Zeichen # "*" THEN
schreibeZeichen ("(");
AltesZeichen := Zeichen; Wiederholen := TRUE
ELSE
INC (BemerkungsTiefe);
IF Zustand = Text THEN
Zustand := Bemerkung;
KursivAn
END;
schreibeZeichen ("("); schreibeZeichen ("*")
END
ELSE
schreibeZeichen (Zeichen)
END
ELSIF Zeichen = "*" THEN
IF (Format = Modula) AND (Zustand = Bemerkung) THEN
schreibeZeichen (Zeichen);
ReadChar (QuellDatei, Zeichen);
IF Zeichen = ")" THEN
schreibeZeichen (Zeichen);
DEC (BemerkungsTiefe);
IF BemerkungsTiefe = 0 THEN
Zustand := Text;
KursivAus
END
ELSE
AltesZeichen := Zeichen; Wiederholen := TRUE
END
ELSE
schreibeZeichen (Zeichen)
END
ELSIF Zeichen = ht THEN
IF Tabulator = 0 THEN
FileOut.Write (ZielDatei, Zeichen)
ELSE
schreibeZeichen (" ");
IF Nummerierung THEN
WHILE (SpaltenPos-RandLinks-6) MOD Tabulator # 0 DO
schreibeZeichen (" ")
END
ELSE
WHILE (SpaltenPos-RandLinks) MOD Tabulator # 0 DO
schreibeZeichen (" ")
END
END
END
ELSE (* CASE *)
IF Format = Modula THEN
TesteModulaWort
ELSE
schreibeZeichen (Zeichen)
END
END;
IF DruckAbbruch THEN
Meldung ("Druck abbrechen?", TRUE);
DruckAbbruch := DruckMeldung
END;
UNTIL DruckAbbruch OR QuellDatei.eof OR (QuellDatei.res # done)
END;
stopDrucken;
Close (ZielDatei);
Close (QuellDatei);
resetDrucken
END DruckeDatei;
PROCEDURE erneuerBoolean ( objekt :ObjektPtr;
Wert :BOOLEAN);
BEGIN
IF Wert THEN
aenderInfoSatz (objekt, ja)
ELSE
aenderInfoSatz (objekt, nein)
END
END erneuerBoolean;
PROCEDURE erneuerQualitaet ( objekt :ObjektPtr);
BEGIN
CASE Einstellung.Qualitaet OF
| Entwurf :aenderInfoSatz (objekt, entwurf)
| Brief :aenderInfoSatz (objekt, brief)
END
END erneuerQualitaet;
PROCEDURE erneuerBreite ( objekt :ObjektPtr);
BEGIN
CASE Einstellung.Breite OF
| Pica :aenderInfoSatz (objekt, Tpica)
| Elite :aenderInfoSatz (objekt, Telite)
| Fine :aenderInfoSatz (objekt, Tfine)
END
END erneuerBreite;
PROCEDURE erneuerFormat ( objekt :ObjektPtr);
BEGIN
CASE Einstellung.Format OF
| Frei :aenderInfoSatz (objekt, frei);
| Modula :aenderInfoSatz (objekt, modula)
END
END erneuerFormat;
PROCEDURE BoolAktion ( Ereignis :ObjektEreignis;
objekt :ObjektPtr);
BEGIN
WITH Einstellung DO
CASE frageObjektNr (objekt) OF
| KopfID:
Kopf := NOT (Kopf);
erneuerBoolean (objekt, Kopf)
| EinzelblattID:
Einzelblatt := NOT (Einzelblatt);
erneuerBoolean (objekt, Einzelblatt)
| VorschubID:
Vorschub := NOT (Vorschub);
erneuerBoolean (objekt, Vorschub)
| NummerierungID:
Nummerierung := NOT (Nummerierung);
erneuerBoolean (objekt, Nummerierung)
END
END
END BoolAktion;
PROCEDURE MinusAktion ( Ereignis :ObjektEreignis;
objekt :ObjektPtr);
VAR n :CARDINAL;
BEGIN
IF Ereignis # Wiederholung THEN
RETURN
END;
WITH Einstellung DO
CASE frageObjektNr (objekt)-minusID OF
| TabulatorID :n := Tabulator;
| RandObenID :n := RandOben;
| RandUntenID :n := RandUnten;
| RandLinksID :n := RandLinks;
| RandRechtsID :n := RandRechts;
| BlattLaengeID :n := BlattLaenge
END;
IF n = 0 THEN
RETURN
END;
DEC (n);
CASE frageObjektNr (objekt)-minusID OF
| TabulatorID :Tabulator := n;
| RandObenID :RandOben := n;
| RandUntenID :RandUnten := n;
| RandLinksID :RandLinks := n;
| RandRechtsID :RandRechts := n;
| BlattLaengeID :BlattLaenge := n
END;
erneuerObjekt (findeObjekt (Fenster, frageObjektNr (objekt)-minusID))
END
END MinusAktion;
PROCEDURE PlusAktion ( Ereignis :ObjektEreignis;
objekt :ObjektPtr);
VAR n :CARDINAL;
BEGIN
IF Ereignis # Wiederholung THEN
RETURN
END;
WITH Einstellung DO
CASE frageObjektNr (objekt)-plusID OF
| TabulatorID :n := Tabulator;
| RandObenID :n := RandOben;
| RandUntenID :n := RandUnten;
| RandLinksID :n := RandLinks;
| RandRechtsID :n := RandRechts;
| BlattLaengeID :n := BlattLaenge
END;
IF n >= 100 THEN
RETURN
END;
INC (n);
CASE frageObjektNr (objekt)-plusID OF
| TabulatorID :Tabulator := n;
| RandObenID :RandOben := n;
| RandUntenID :RandUnten := n;
| RandLinksID :RandLinks := n;
| RandRechtsID :RandRechts := n;
| BlattLaengeID :BlattLaenge := n
END;
erneuerObjekt (findeObjekt (Fenster, frageObjektNr (objekt)-plusID))
END
END PlusAktion;
PROCEDURE QualitaetAktion ( Ereignis :ObjektEreignis;
objekt :ObjektPtr);
BEGIN
WITH Einstellung DO
CASE Qualitaet OF
| Entwurf :Qualitaet := Brief;
| Brief :Qualitaet := Entwurf
END;
erneuerQualitaet (objekt)
END
END QualitaetAktion;
PROCEDURE BreiteAktion ( Ereignis :ObjektEreignis;
objekt :ObjektPtr);
BEGIN
WITH Einstellung DO
CASE Breite OF
| Pica :Breite := Elite
| Elite :Breite := Fine
| Fine :Breite := Pica
END;
erneuerBreite (objekt)
END
END BreiteAktion;
PROCEDURE FormatAktion ( Ereignis :ObjektEreignis;
objekt :ObjektPtr);
BEGIN
WITH Einstellung DO
CASE Format OF
| Frei :Format := Modula
| Modula :Format := Frei
END;
erneuerFormat (objekt)
END
END FormatAktion;
PROCEDURE BenutzeParameter ( EingabeText :ARRAY OF CHAR;
VAR ParameterFehler :BOOLEAN);
CONST G1 ="KOPF EINZELBLATT VORSCHUB NUMMERIERUNG ZIEL ";
G2 ="TABULATOR RANDOBEN RANDUNTEN RANDLINKS RANDRECHTS ";
G3 ="BLATTLÄNGE QUALITÄT BREITE FORMAT ";
VAR i :CARDINAL;
Parameter :TDateiname;
Gesamt :ARRAY [0..130] OF CHAR;
PROCEDURE TesteBoolean (VAR Boolean :BOOLEAN;
Satz :ARRAY OF CHAR);
BEGIN
UpString (Satz);
IF Compare (Satz, "JA") = 0 THEN
Boolean := TRUE;
ELSIF Compare (Satz, "NEIN") = 0 THEN
Boolean := FALSE
ELSE
ParameterFehler := TRUE
END
END TesteBoolean;
PROCEDURE TesteCardinal (VAR Zahl :CARDINAL;
Satz :ARRAY OF CHAR);
VAR Negativ, Fehler :BOOLEAN;
iZahl :LONGINT;
BEGIN
StrToVal (Satz, iZahl, Negativ, 10, Fehler);
IF NOT (Fehler) AND (0 <= iZahl) AND (iZahl <= 1000) THEN
Zahl := CARDINAL (iZahl)
ELSE
ParameterFehler := TRUE
END
END TesteCardinal;
(* BenutzeParameter *)
BEGIN
ParameterFehler := FALSE;
WITH Einstellung DO
Copy (Gesamt, G1); Concat (Gesamt, G2); Concat (Gesamt, G3);
i := 0;
WHILE (i < CARDINAL (HIGH (EingabeText))) AND (EingabeText[i] # 0C) DO
IF EingabeText[i] = sp THEN
Delete (EingabeText, i, 1)
ELSE
INC (i)
END
END;
i := CARDINAL (FirstPos (EingabeText, 0, "="));
Copy (Parameter, EingabeText);
Parameter[i] := sp; Parameter[i+1] := 0C;
UpString (Parameter);
Delete (EingabeText, 0, i+1);
CASE Occurs (Gesamt, 0, Parameter, FALSE) OF
| 0:
TesteBoolean (Kopf, EingabeText);
erneuerBoolean (findeObjekt (Fenster, KopfID), Kopf)
| 5:
TesteBoolean (Einzelblatt, EingabeText);
erneuerBoolean (findeObjekt (Fenster, EinzelblattID), Einzelblatt)
| 17:
TesteBoolean (Vorschub, EingabeText);
erneuerBoolean (findeObjekt (Fenster, VorschubID), Vorschub)
| 26:
TesteBoolean (Nummerierung, EingabeText);
erneuerBoolean (findeObjekt (Fenster, NummerierungID), Nummerierung)
| 39:
Copy (Ziel, EingabeText);
erneuerObjekt (findeObjekt (Fenster, ZielID))
| 44:
TesteCardinal (Tabulator, EingabeText);
erneuerObjekt (findeObjekt (Fenster, TabulatorID))
| 54:
TesteCardinal (RandOben, EingabeText);
erneuerObjekt (findeObjekt (Fenster, RandObenID))
| 63:
TesteCardinal (RandUnten, EingabeText);
erneuerObjekt (findeObjekt (Fenster, RandUntenID))
| 73:
TesteCardinal (RandLinks, EingabeText);
erneuerObjekt (findeObjekt (Fenster, RandLinksID))
| 83:
TesteCardinal (RandRechts, EingabeText);
erneuerObjekt (findeObjekt (Fenster, RandRechtsID))
| 94:
TesteCardinal (BlattLaenge, EingabeText);
erneuerObjekt (findeObjekt (Fenster, BlattLaengeID))
| 105:
UpString (EingabeText);
IF Compare (EingabeText, "ENTWURF") = 0 THEN
Qualitaet := Entwurf;
erneuerQualitaet (findeObjekt (Fenster, QualitaetID))
ELSIF Compare (EingabeText, "BRIEF") = 0 THEN
Qualitaet := Brief;
erneuerQualitaet (findeObjekt (Fenster, QualitaetID))
ELSE
ParameterFehler := TRUE
END
| 114:
UpString (EingabeText);
IF Compare (EingabeText, "PICA") = 0 THEN
Breite := Pica;
erneuerBreite (findeObjekt (Fenster, BreiteID))
ELSIF Compare (EingabeText, "ELITE") = 0 THEN
Breite := Elite;
erneuerBreite (findeObjekt (Fenster, BreiteID))
ELSIF Compare (EingabeText, "FINE") = 0 THEN
Breite := Fine;
erneuerBreite (findeObjekt (Fenster, BreiteID))
ELSE
ParameterFehler := TRUE
END
| 121:
UpString (EingabeText);
IF Compare (EingabeText, "FREI") = 0 THEN
Format := Frei;
erneuerObjekt (findeObjekt (Fenster, FormatID))
ELSIF Compare (EingabeText, "MODULA") = 0 THEN
Format := Modula;
erneuerObjekt (findeObjekt (Fenster, FormatID))
ELSE
ParameterFehler := TRUE
END
END
END
END BenutzeParameter;
PROCEDURE OeffnenAktion ( Ereignis :ObjektEreignis;
objekt :ObjektPtr);
VAR Fehler :BOOLEAN;
Dateiname :ARRAY [0..maxDateiname] OF CHAR;
BEGIN
Dateiname[0] := 0C;
IF FileReq (Dateiname, Fenster, "D2: Quelldatei ?", TRUE) THEN
DruckeDatei (Dateiname, Fehler)
END
END OeffnenAktion;
PROCEDURE verarbeiteEingabe ( objekt :ObjektPtr) :BOOLEAN;
VAR Fehler :BOOLEAN;
BEGIN
Fehler := FALSE;
IF frageEnde () = returnEnde THEN
IF EingabeText[0] = 0C THEN
Programmende := TRUE
ELSE
IF FirstPos (EingabeText, 0, "=") # -1 THEN
BenutzeParameter (EingabeText, Fehler)
ELSE
DruckeDatei (EingabeText, Fehler)
END;
IF NOT Fehler THEN
EingabeText[0] := 0C
END
END
END;
RETURN NOT (Fehler)
END verarbeiteEingabe;
PROCEDURE startD2;
VAR neuFenster :NewWindow;
textAttr :TextAttr;
BEGIN
Programmende := FALSE;
initNewWindow (neuFenster,
0,12, 640,244,
0,1,
IDCMPFlagSet {closeWindow, newSize, sizeVerify},
WindowFlagSet {windowSizing, windowDrag, windowDepth,
noCareRefresh, windowClose},
NIL, (* firstGadget *)
NIL, (* Checkmark *)
ADR (Programmname),
NIL, (* Screen *)
NIL, (* Bitmap *)
100, 50, -1,-1,
ScreenFlagSet {wbenchScreen});
Fenster := OpenWindow (neuFenster);
Assert (Fenster # NIL, ADR (keinFenster));
initTextAttr (textAttr, ADR ("topaz.font"), 8, FontStyleSet {}, FontFlagSet {});
Topaz8 := OpenFont (textAttr);
Assert (Topaz8 # NIL, ADR (keinZeichensatz));
initTextAttr (textAttr, ADR ("pearl.font"), 8, FontStyleSet {}, FontFlagSet {});
Pearl8 := OpenFont (textAttr);
UseWindow (Fenster); UseFont (Topaz8);
setzeTextZeichensatz ("topaz.font", 8, FontStyleSet {});
IF Pearl8 # NIL THEN
setzeEingabeZeichensatz ("pearl.font", 8, FontStyleSet {})
ELSE
setzeEingabeZeichensatz ("topaz.font", 8, FontStyleSet {})
END;
schreibeInfo;
WITH Einstellung DO
erzeugeBooleanObjekt (Fenster, 450, 25, nein, KopfID,
melden, BoolAktion);
erzeugeBooleanObjekt (Fenster, 450, 34, nein, EinzelblattID,
melden, BoolAktion);
erzeugeBooleanObjekt (Fenster, 450, 43, nein, VorschubID,
melden, BoolAktion);
erzeugeBooleanObjekt (Fenster, 450, 52, nein, NummerierungID,
melden, BoolAktion);
erzeugeBooleanObjekt (Fenster, 450, 61, entwurf, QualitaetID,
melden, QualitaetAktion);
erzeugeBooleanObjekt (Fenster, 450, 70, Tpica, BreiteID,
melden, BreiteAktion);
erzeugeBooleanObjekt (Fenster, 450, 79, frei, FormatID,
melden, FormatAktion);
erneuerBoolean (findeObjekt (Fenster, KopfID), Kopf);
erneuerBoolean (findeObjekt (Fenster, EinzelblattID), Einzelblatt);
erneuerBoolean (findeObjekt (Fenster, VorschubID), Vorschub);
erneuerBoolean (findeObjekt (Fenster, NummerierungID), Nummerierung);
erneuerQualitaet (findeObjekt (Fenster, QualitaetID));
erneuerBreite (findeObjekt (Fenster, BreiteID));
erneuerFormat (findeObjekt (Fenster, FormatID));
erzeugeCardObjekt (Fenster, 450, 88, "Tabulator",
TabulatorID, -410, 0, 5, EingabeOk, Tabulator);
erzeugeBooleanObjekt (Fenster, 497, 88, minus, TabulatorID + minusID,
wiederholen, MinusAktion);
erzeugeBooleanObjekt (Fenster, 523, 88, plus, TabulatorID + plusID,
wiederholen, PlusAktion);
erzeugeCardObjekt (Fenster, 450, 97, "oberer Rand",
RandObenID, -410, 0, 5,EingabeOk, RandOben);
erzeugeBooleanObjekt (Fenster, 497, 97, minus, RandObenID + minusID,
wiederholen, MinusAktion);
erzeugeBooleanObjekt (Fenster, 523, 97, plus, RandObenID + plusID,
wiederholen, PlusAktion);
erzeugeCardObjekt (Fenster, 450,106, "unterer Rand",
RandUntenID, -410, 0, 5,EingabeOk, RandUnten);
erzeugeBooleanObjekt (Fenster, 497,106, minus, RandUntenID + minusID,
wiederholen, MinusAktion);
erzeugeBooleanObjekt (Fenster, 523,106, plus, RandUntenID + plusID,
wiederholen, PlusAktion);
erzeugeCardObjekt (Fenster, 450,115, "linker Rand",
RandLinksID, -410, 0, 5,EingabeOk, RandLinks);
erzeugeBooleanObjekt (Fenster, 497,115, minus, RandLinksID + minusID,
wiederholen, MinusAktion);
erzeugeBooleanObjekt (Fenster, 523,115, plus, RandLinksID + plusID,
wiederholen, PlusAktion);
erzeugeCardObjekt (Fenster, 450,124, "rechter Rand",
RandRechtsID, -410, 0, 5,EingabeOk, RandRechts);
erzeugeBooleanObjekt (Fenster, 497,124, minus, RandRechtsID + minusID,
wiederholen, MinusAktion);
erzeugeBooleanObjekt (Fenster, 523,124, plus, RandRechtsID + plusID,
wiederholen, PlusAktion);
erzeugeCardObjekt (Fenster, 450,133, "Blattlänge",
BlattLaengeID, -410, 0, 5,EingabeOk, BlattLaenge);
erzeugeBooleanObjekt (Fenster, 497,133, minus, BlattLaengeID + minusID,
wiederholen, MinusAktion);
erzeugeBooleanObjekt (Fenster, 523,133, plus, BlattLaengeID + plusID,
wiederholen, PlusAktion);
erzeugeTextObjekt (Fenster, 450,142, "Ziel",
ZielID, -410, 0, 20, maxDateiname, EingabeOk, Ziel);
erzeugeTextObjekt (Fenster, 110, 225, "Eingabe:",
EingabeID, -70, 0, maxDateiname, maxDateiname,
verarbeiteEingabe, EingabeText);
erzeugeBooleanObjekt (Fenster, 500, 225, " öffne ... ",
OeffnenID, melden, OeffnenAktion);
verbindeObjekte (Fenster, TabulatorID, -1, RandObenID, -1, -1);
verbindeObjekte (Fenster, RandObenID, TabulatorID, RandUntenID, -1, -1);
verbindeObjekte (Fenster, RandUntenID, RandObenID, RandLinksID, -1, -1);
verbindeObjekte (Fenster, RandLinksID, RandObenID, RandRechtsID, -1, -1);
verbindeObjekte (Fenster, RandRechtsID, RandLinksID, BlattLaengeID,-1, -1);
verbindeObjekte (Fenster, BlattLaengeID, RandRechtsID, ZielID, -1, -1);
verbindeObjekte (Fenster, ZielID, BlattLaengeID, EingabeID, -1, -1);
verbindeObjekte (Fenster, EingabeID, ZielID, -1, -1, -1)
END
END startD2;
PROCEDURE stopD2;
BEGIN
IF MFenster # NIL THEN
loescheAlleObjekte (MFenster);
CloseWindow (MFenster)
END;
IF Fenster # NIL THEN
loescheAlleObjekte (Fenster)
END;
CloseFont (Pearl8);
CloseFont (Topaz8);
CloseWindow (Fenster)
END stopD2;
PROCEDURE verarbeiteParameter ( ErstesArgument :CARDINAL);
VAR Fehler :BOOLEAN;
i,j, Laenge :INTEGER;
EingabeText :TDateiname;
BEGIN
FOR i := ErstesArgument TO NumArgs () DO
FOR j := 0 TO 5 DO
SetAPen (0);
FillRectangle (40,158+j*8, 550,166+j*8);
IF i+j <= NumArgs () THEN
GetArg (i+j, EingabeText, Laenge);
SetAPen (1);
Move ( 50,165+j*8); WriteCard (i+j, 4);
Move ( 90,165+j*8); Write ("'"); WriteString (EingabeText); Write ("'")
END
END;
GetArg (i, EingabeText, Laenge);
IF EingabeText[0] # 0C THEN
IF FirstPos (EingabeText, 0, "=") # -1 THEN
BenutzeParameter (EingabeText, Fehler)
ELSIF Occurs (EingabeText, 0, ".obj", FALSE) = -1 THEN
DruckeDatei (EingabeText, Fehler)
END
END
END;
SetAPen (0); FillRectangle (50,158, 550,206)
END verarbeiteParameter;
(* d2 *)
BEGIN
Fenster := NIL;
MFenster := NIL;
TermProcedure (stopD2);
BenutzeStandard (Einstellung);
BenutzePreferences (Einstellung);
BenutzeIcon (Einstellung, ErstesArgument);
startD2;
verarbeiteParameter (ErstesArgument);
WHILE NOT Programmende DO
WaitPort (Fenster^.userPort);
REPEAT
NachrichtPtr := GetMsg (Fenster^.userPort);
IF NachrichtPtr # NIL THEN
Nachricht := NachrichtPtr^;
ReplyMsg (NachrichtPtr);
verarbeiteNachricht (Fenster, Nachricht);
IF closeWindow IN Nachricht.class THEN
Programmende := TRUE
ELSIF newSize IN Nachricht.class THEN
NewWindowSize;
schreibeInfo
ELSIF sizeVerify IN Nachricht.class THEN
(* keine Aktion, nur Synchronisation! *)
END
END
UNTIL (NachrichtPtr = NIL) OR Programmende
END
END d2.